Muchas veces nos encontramos con la situación de crear un gráfico que se ve bien en el panel Plot de RStudio y cuando lo exportamos o incluímos dentro de un documento de Quarto el tamaño de sus partes (elementos geométricos, textos, leyendas, etc) se achican o agrandan de tal forma que el producto final es feo y/o desproporcionado.
La respuesta a estos problemas tienen que ver con dos conceptos que debemos entender y poder controlar: el tamaño y la resolución.
Repasemos algunos conceptos de la imagen en pantalla:
Hagamos algunos calculos para ver si todo está en orden:
ancho: 1920 (px) / 96 (px/in) = 20 pulgadas
alto: 1200 (px) / 96 (px/in) = 12,5 pulgadas
relación: 1920 / 1200 = 20 / 12,5 = 16/10
Las imágenes que se crean con ggplot2, por ejemplo, están constituidas por pixeles.
En estas imágenes también se relacionan las dimensiones y las resoluciones.
Para pasar de la dimensión en pulgadas a una cantidad de puntos, por ejemplo al exportar con ggsave() se utiliza la cantidad de puntos por pulgadas (dpi).
Si creamos un gráfico de 12 x 10 pulgadas a 300 dpi, el archivo será una matriz de (12 * 300) x (10 * 300) = 3600 x 3000 puntos.
Cuando abrimos el archivo en nuestra computadora, cada punto representa un pixel, lo que da una imagen de 3600 x 3000 px de resolución.
Imaginemos que tenemos una imagen de 500x500px. Así se vería cada una, con un zoom del 100%, en un monitor de 1080p (1920x1080px) y en otro 4K (3840×2160), ambos del mismo tamaño.
Hagamos un pequeño experimento con un gráfico sencillo basado en los pinguinos.
Si calculamos, la salida se almacena como:
ancho: 10 pulgadas * 300 dpi = 3000 px
alto: 5 pulgadas * 300 dpi = 1500 px
Ahora si en lugar de guardar el gráfico solo lo visualizaramos en el monitor:
ancho: 10 pulgadas * 96 dpi = 960 px
alto: 5 pulgadas * 96 dpi = 480 px
Si visualizamos un gráfico con muchos más pixeles que otro en el mismo espacio (nuestra pantalla) los elementos que lo componen se van a ver siempre más pequeños.
Importa porque algunos elementos del gráfico se ajustan al espacio disponible, y algunos son fijos y medidos en su dimensión real (cm, mm o pulgadas) como las fuentes de los textos, creando una distorsión al cambiar la dimensión del gráfico o su resolución.
| Formato | Por defecto |
|---|---|
| Por defecto | 7 x 5 |
| Diapositivas HTML | 9,5 x 6,5 |
| Diapositivas HTML (reveal.js) | 9 x 5 |
| 5,5 x 3,5 | |
| Diapositivas PDF (Beamer) | 10x7 |
| PowerPoint | 7,5 x 5,5 |
| MS Word, ODT, RTF | 5x4 |
| EPUB | 5x4 |
* Medidas en pulgadas
Comparemos dos archivos exportados desde ggplot2:
font_prueba1_5x5_300.png
font_prueba1_10x10_300.png
Observamos que el tamaño del punto y la fuente parecen más pequeños en el gráfico de la derecha.
De hecho no son más pequeños, siguen teniendo el mismo tamaño en pulgadas, y como guardamos con la misma resolución (dpi = 300), tienen el mismo número de puntos (tamaño en pulgadas * 300).
La fuente del gráfico aparece más pequeña porque el segundo gráfico es más grande (3000x3000 frente a 1500x1500) y se reduce su aspecto para que el gráfico entre el espacio de la pantalla.
Hay 3 soluciones posibles:
Además tenemos otro problema. De forma predeterminada, el tamaño de las fuentes de la configuración de theme() está definido en pts. (15 significa 15 puntos - pts-).
En cambio, en la capa geom_text(), el tamaño se define en mm, por lo que 15 es 15 mm.
1 punto = 1/72 pulgadas
1 punto = 0,35 mm
Entonces si queremos que el texto tenga el mismo tamaño que el título, el tamaño en mm será 15 pt * 0,35 pt/mm = 5,25 mm
En ggplot, hay una constante definida para realizar la conversión, .pt = 2,845276. (1/.pt = 0,35). Podemos escribir .pt en la consola y mostrará su valor:
Entonces para hacer la conversión:
de pt a mm : mm = pt / .pt -> 15 / 2,845276 = 5,27 mm
de mm a pt : pt = mm * .pt -> 5,27 * 2,845276 = 15 pts
Este paquete declara un espacio de exportación con agg_*() (por ejemplo para un archivo png), luego se ejecuta el código del gráfico, finalmente se cierra el espacio con dev.off().
La función incorpora un argumento scaling que posibilita escalar los elementos como el texto adaptandose a variaciones en los tamaños de salida.
PNG de 10 x 10 pulgadas con resolucion de 300 dpi
PNG de 20 x 20 pulgadas con resolucion de 300 dpi
Instituto Nacional de Epidemiología